<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>闭包和立即执行函数</title>
</head>

<body>

</body>
<script>
    function test() {
        var arr = [];
        for (var index = 0; index < 10; index++) {
            // 立即执行函数
            arr[index] = (function () {
                document.write(index + " ")
            })(index)

        }
        return arr;
    }
    var res = test()
    // 因为index在函数执行时,已被赋值为10,产生了闭包(在Method外部访问并修改method内部变量),输出结果为10个10
    // 解决方案1:var改为let-->ES6特性,形成局部作用域规避同名变量混用问题
    // 解决方案2:立即执行函数,执行完毕后自动销毁函数上下文,避免局部变量作用域混淆
    for (var index = 0; index < res.length; index++) {
        const method = res[index];
        // method();
    }
</script>
<script>
    function Test(a, b, c) {
        var d = 0;
        this.a = a;
        this.b = b;
        this.c = c
        function e() {
            d++;
            console.log(d);
        }
        this.f = e;
    }
    var test1 = new Test();
    test1.f();
    test1.f();
    var test2 = new Test();
    test2.f();

</script>

</html>